package packLigaDeFutbol;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class GestorPartidos {

	private static GestorPartidos miGestor = new GestorPartidos();
	private ListaPartidos listaPartidos = new ListaPartidos();

	private GestorPartidos() {}

	public static GestorPartidos get(){
		if (miGestor == null) 
			miGestor = new GestorPartidos();

		return miGestor;
	}

	/**
	 * @author Andoni
	 * 
	 * @return devuelve la informaci�n b�sica de un partido
	 */
	public ResultSet obtenerInformacionDePartido(int pIdPartido) {

		ResultSet rs = null;
		
		String strSQL = "select el.nombre AS eqlocal, "+
							   "ev.nombre AS eqvis, "+
	                           "ar.nombre AS arbitro, "+
	                           "goles.locales, goles.visitante "+
	                           "FROM equipo el, equipo ev, arbitro ar, partido p, "+
	                           		"(SELECT COUNT(*),"+
	                           			    "SUM(CASE WHEN idJugador IN (SELECT idjugador from jugador where idequipo = 1) then 1 else 0 end) as locales, "+
	                           		        "SUM(CASE WHEN idJugador IN (SELECT idjugador from jugador where idequipo = 2) then 1 else 0 end) as visitante "+
	                           		"from actuacion "+
	                           		"where idpartido = " + pIdPartido + " " +
	                           		"and idtipo = 1) as goles " +
	                           "WHERE p.idpartido = " + pIdPartido + " " + 
	                           "AND el.idEquipo = p.idlocal "+
	                           "AND ev.idEquipo = p.idvisitante " +
	                           "AND ar.idArbitro = p.idarbitro";
		try {
			rs = Principal.BBDD.consulta(strSQL);
		} catch (SQLException ex) {
			System.out.println("obtenerInformacionDePartido:");
			System.out.println("SQLException: " + ex.getMessage());
			System.out.println("SQLState: " + ex.getSQLState());
			System.out.println("VendorError: " + ex.getErrorCode());
		}
		
		return rs;
	}
	
	/**
	 * @author Andoni
	 * 
	 * @return devuelve lo jugadores titulares de un equipo
	 */
	public ResultSet obtenerTitularesDeEquipo(int pIdPartido, int pIdEquipo) {

		ResultSet rs = null;
		String strSQL = "SELECT jugador.idJugador AS id, nombreJug AS nombre, jugador.dorsal " +
				"FROM jugador, "+
				"convocatoria RIGHT JOIN alineacion " +
				"ON alineacion.idPartido = convocatoria.idpartido "+
				"WHERE alineacion.idpartido = " + pIdPartido + " " +
				"AND convocatoria.idpartido = " + pIdPartido + " " +
				"AND alineacion.idpartido = " + pIdPartido + " " +
				"AND jugador.idequipo = " + pIdEquipo + " " +
				"AND jugador.idjugador = convocatoria.idjugador "+
				"AND jugador.idjugador = alineacion.idjugador";
		try {
			rs = Principal.BBDD.consulta(strSQL);
		}
		catch(SQLException ex) {
			System.out.println("obtenerTitularesDeEquipo:");
			System.out.println("SQLException: " + ex.getMessage());
			System.out.println("SQLState: " + ex.getSQLState());
			System.out.println("VendorError: " + ex.getErrorCode());
		}
		return rs;
	}

	/**
	 * @author Andoni
	 * 
	 * @return devuelve los jugadores convocados de un equipo
	 */
	public ResultSet obtenerConvocadosDeEquipo(int pIdPartido, int pIdEquipo) {

		ResultSet rs = null;
		String strSQL = "SELECT j.idjugador AS id, j.nombreJug AS nombre, j.dorsal AS dorsal " +
				"FROM convocatoria c, jugador j " +
				"WHERE c.idpartido = " + pIdPartido + " " +
				"AND j.idequipo = " + pIdEquipo + " " +
				"AND c.idjugador=j.idjugador";
		try {
			rs = Principal.BBDD.consulta(strSQL);
		}
		catch(SQLException ex) {
			System.out.println("obtenerConvocadosDeEquipo:");
			System.out.println("SQLException: " + ex.getMessage());
			System.out.println("SQLState: " + ex.getSQLState());
			System.out.println("VendorError: " + ex.getErrorCode());
		}
		return rs;
	}

	/**
	 * @author Andoni
	 * 
	 * @return devuelve los goles de un equipo en un partido
	 */
	public ResultSet obtenerGolesDeEquipoEnPartido(int pIdPartido, int pIdEquipo){
		ResultSet rs = null;
		String strSQL = "SELECT actuacion.minuto AS minuto, jugador.nombreJug AS nombre " +
				"FROM actuacion, jugador " +
				"WHERE actuacion.idpartido = " + pIdPartido + " " +
				"AND jugador.idequipo = " + pIdEquipo + " " +
				"AND actuacion.idtipo = 1 " +
				"AND jugador.idjugador = actuacion.idjugador";
		try {
			rs = Principal.BBDD.consulta(strSQL);
		}
		catch(SQLException ex) {
			System.out.println("SQLException: " + ex.getMessage());
			System.out.println("SQLState: " + ex.getSQLState());
			System.out.println("VendorError: " + ex.getErrorCode());
		}
		return rs;
	}

	/**
	 * @author Andoni
	 * 
	 * @return Devuelve las tarjetas rojas y amarillas de un partido
	 */
	public ResultSet obtenerTarjetasDeEquipoEnPartido(int pIdPartido, int pIdEquipo){
		ResultSet rs = null;
		String strSQL = "Select actuacion.minuto as minuto, tipoactuacion.nombre as tarjeta ,jugador.nombreJug as nombre " +
				"from actuacion, tipoactuacion, jugador " +
				"where actuacion.idpartido = " + pIdPartido + " " +
				"and jugador.idequipo = " + pIdEquipo + " " +
				"and actuacion.idtipo in (2,3) " +
				"and jugador.idjugador = actuacion.idjugador " +
				"and actuacion.idtipo = tipoactuacion.idtipoactuacion";
		try {
			rs = Principal.BBDD.consulta(strSQL);
		}
		catch(SQLException ex) {
			System.out.println("SQLException: " + ex.getMessage());
			System.out.println("SQLState: " + ex.getSQLState());
			System.out.println("VendorError: " + ex.getErrorCode());
		}
		return rs;
	}

	/**
	 * @author Andoni
	 * 
	 * @return Devuelve los cambios realizados en un partido
	 */
	public ResultSet obtenerCambiosDeEquipoEnPartido(int pIdPartido, int pIdEquipo){
		ResultSet rs = null;
		String strSQL = "Select actuacion.minuto as minuto, " + 
				"jEntra.nombreJug as entra, " + 
				"jSale.nombreJug as sale " +
				"from actuacion, cambio, jugador as jEntra, jugador as jSale " + 
				"where actuacion.idpartido = " + pIdPartido + " " +
				"and jEntra.idequipo = " + pIdEquipo + " " +
				"and jSale.idequipo = " + pIdEquipo + " " +
				"and actuacion.idtipo = 4 " +
				"and cambio.idjugadorentra = jEntra.idjugador " +
				"and actuacion.idjugador = jSale.idjugador " +
				"and cambio.idactuacion = actuacion.idactuacion";
		try {
			rs = Principal.BBDD.consulta(strSQL);
		}
		catch(SQLException ex) {
			System.out.println("SQLException: " + ex.getMessage());
			System.out.println("SQLState: " + ex.getSQLState());
			System.out.println("VendorError: " + ex.getErrorCode());
		}
		return rs;
	}

	/**
	 * @author 
	 * @param pIdPartido
	 */
	public ResultSet obtenerEquiposDePartido(int pIdPartido){
		ResultSet rs = null;
		String strSQL = "SELECT idLocal, idVisitante " + 
				"FROM partido " + 
				"WHERE idPartido = " + pIdPartido;
		try {
			rs = Principal.BBDD.consulta(strSQL);
		}
		catch(SQLException e) {
			e.printStackTrace();
		}
		return rs;
	}

	/**
	 * @author Hector
	 * @param pIdArbitro
	 * @return
	 */
	public ResultSet obtenerPartidosDeArbitro(int pIdArbitro) {

		ResultSet partidos = null;
		String strSQL = "SELECT p.idPartido AS valor, CONCAT(e1.nombre, ' - ', e2.nombre) AS nombre " +
				"FROM partido p, arbitro a, equipo e1, equipo e2 " +
				"WHERE p.idArbitro = a.idArbitro " +
				"AND a.idArbitro = " +  pIdArbitro + " " +
				"AND e1.idEquipo = p.idLocal " +
				"AND e2.idEquipo = p.idVisitante";
		try {
			partidos = Principal.BBDD.consulta(strSQL);
		}
		catch(SQLException ex) {
			System.out.println("obtenerPartidosDeArbitro");
			System.out.println("SQLException: " + ex.getMessage());
			System.out.println("SQLState: " + ex.getSQLState());
			System.out.println("VendorError: " + ex.getErrorCode());
		}
		return partidos;
	}

	//Hector
	public ResultSet obtenerTitularesDePartido(int pIdPartido) {

		ResultSet rs = null;
		String strSQL = "SELECT jugador.idJugador AS valor, nombreJug AS nombre " +
				"FROM jugador, "+
				"convocatoria RIGHT JOIN alineacion " +
				"ON alineacion.idPartido = convocatoria.idpartido " +
				"WHERE alineacion.idpartido = " + pIdPartido + " " +
				"AND convocatoria.idpartido = " + pIdPartido + " " +
				"AND alineacion.idpartido = " + pIdPartido + " " +
				"AND jugador.idjugador = convocatoria.idjugador "+
				"AND jugador.idjugador = alineacion.idjugador";
		try {
			rs = Principal.BBDD.consulta(strSQL);
		}
		catch(SQLException ex) {
			System.out.println("obtenerTitularesDePartido:");
			System.out.println("SQLException: " + ex.getMessage());
			System.out.println("SQLState: " + ex.getSQLState());
			System.out.println("VendorError: " + ex.getErrorCode());
		}
		return rs;
	}

	//Hector
	public ResultSet obtenerSuplentesDePartido(int pIdPartido) {

		ResultSet rs = null;
		String strSQL = "SELECT j.idJugador as valor, j.nombrejug as nombre " +
				"FROM convocatoria c, jugador j " +
				"WHERE c.idJugador NOT IN (SELECT idJugador " +
										  "FROM alineacion " + 
										  "WHERE alineacion.idPartido = " + pIdPartido + ") " +
				"AND c.idPartido = " + pIdPartido + " " +
				"AND c.idJugador = j.idJugador";
		try {
			rs = Principal.BBDD.consulta(strSQL);
		}
		catch(SQLException ex) {
			System.out.println("obtenerSuplentesDePartido:");
			System.out.println("SQLException: " + ex.getMessage());
			System.out.println("SQLState: " + ex.getSQLState());
			System.out.println("VendorError: " + ex.getErrorCode());
		}
		return rs;
	}

	//Hector
	public ResultSet obtenerJugadoresDePartido(int pIdPartido) {

		ResultSet rs = null;
		String strSQL = "SELECT j.idjugador as valor, j.nombreJug as nombre " +
				"FROM convocatoria c, jugador j " +
				"WHERE c.idPartido = " + pIdPartido + " " +
				"and c.idjugador = j.idjugador";
		try {
			rs = Principal.BBDD.consulta(strSQL);
		}
		catch(SQLException ex) {
			System.out.println("obtenerJugadoresDePartido:");
			System.out.println("SQLException: " + ex.getMessage());
			System.out.println("SQLState: " + ex.getSQLState());
			System.out.println("VendorError: " + ex.getErrorCode());
		}
		return rs;
	}
	//hector
		public ResultSet obtenerArbitrosDisponiblesEsaJornadaConProvinciaDistintaALaDeLosEquiposDelPartido(int pIdPartido) {

			ResultSet rs = null;
			String strSQL = "SELECT a.idArbitro as valor, a.nombre as nombre " +
				    "from arbitro a, partido p, equipo el, equipo ev " +
				    "where p.idpartido = " + pIdPartido + " " +
				    "and el.idEquipo = p.idlocal " +
				    "and ev.idEquipo = p.idvisitante " +
				    "and a.provincia != el.provincia " +
				    "and a.provincia != ev.provincia " +
				    "order by a.nombre ASC " ;
			try {
				rs = Principal.BBDD.consulta(strSQL);
			}
			catch(SQLException ex) {
				System.out.println("obtenerArbitrosDisponiblesEsaJornadaConProvinciaDistintaALaDeLosEquiposDelPartido:");
				System.out.println("SQLException: " + ex.getMessage());
				System.out.println("SQLState: " + ex.getSQLState());
				System.out.println("VendorError: " + ex.getErrorCode());
			}
			return rs;
		}
/*
	 * 
	 */

	//Hector 
	public ResultSet mostrarTarjetasDePartido(int pIdPartido) {
		ResultSet rs = null;

		String strSQL = "Select actuacion.idActuacion as id, actuacion.minuto as minuto, tipoactuacion.nombre as tarjeta ,jugador.nombreJug as nombre " +
				"from actuacion, tipoactuacion, jugador " +
				"where actuacion.idpartido = " + pIdPartido + " " +
				"and actuacion.idtipo in (2,3) " +
				"and jugador.idjugador = actuacion.idjugador " +
				"and actuacion.idtipo = tipoactuacion.idtipoactuacion";
		try {
			rs = Principal.BBDD.consulta(strSQL);

		}
		catch(SQLException ex) {
			System.out.println("mostrarTarjetasDePartido:");
			System.out.println("SQLException: " + ex.getMessage());
			System.out.println("SQLState: " + ex.getSQLState());
			System.out.println("VendorError: " + ex.getErrorCode());
		}
		return rs;
	}

	//hector 
	public ResultSet mostrarGolesDePartido(int pIdPartido) {
		ResultSet rs = null;

		String strSQL = "SELECT actuacion.idActuacion as id,actuacion.minuto AS minuto, jugador.nombreJug AS nombre " +
				"FROM actuacion, jugador " +
				"WHERE actuacion.idpartido = " + pIdPartido + " " +
				"AND actuacion.idtipo = 1 " +
				"AND jugador.idjugador = actuacion.idjugador";;
				try {
					rs = Principal.BBDD.consulta(strSQL);

				}
				catch(SQLException ex) {
					System.out.println("mostrarGolesDePartido:");
					System.out.println("SQLException: " + ex.getMessage());
					System.out.println("SQLState: " + ex.getSQLState());
					System.out.println("VendorError: " + ex.getErrorCode());
				}
				return rs;
	}

	//hector 
	public ResultSet mostrarCambiosDePartido(int pIdPartido) {
		ResultSet rs = null;

		String strSQL = "Select actuacion.idactuacion as id, actuacion.minuto as minuto, " + 
				"jEntra.nombreJug as entra, " + 
				"jSale.nombreJug as sale " +
				"from actuacion, cambio, jugador as jEntra, jugador as jSale " + 
				"where actuacion.idpartido = " + pIdPartido + " " +
				"and actuacion.idtipo = 4 " +
				"and cambio.idjugadorentra = jEntra.idjugador " +
				"and actuacion.idjugador = jSale.idjugador " +
				"and cambio.idactuacion = actuacion.idactuacion";
		try {
			rs = Principal.BBDD.consulta(strSQL);

		}
		catch(SQLException ex) {
			System.out.println("mostrarCambiosDePartido:");
			System.out.println("SQLException: " + ex.getMessage());
			System.out.println("SQLState: " + ex.getSQLState());
			System.out.println("VendorError: " + ex.getErrorCode());
		}
		return rs;
	}
	//HECTOR
	public ResultSet ObtenerFechasDeJornadas(int pTemporada) {

		ResultSet rs = null;
		String strSQL = "SELECT idJornada AS valor, DATE_FORMAT(fecha, '%d - %m - %Y') AS nombre " +
						"FROM jornada " +
						"WHERE idTemporada = " + pTemporada;
		try {
			rs = Principal.BBDD.consulta(strSQL);
		}
		catch(SQLException ex) {
			System.out.println("ObtenerFechasDeJornadas(): ");
			System.out.println("SQLException: " + ex.getMessage());
			System.out.println("SQLState: " + ex.getSQLState());
			System.out.println("VendorError: " + ex.getErrorCode());
		}
		return rs;
	}
	
	
	/**
	 * @author Jonatan Perez
	 * Inserta en la BD los partidos correspondientes a una temporada
	 */
	public boolean insertarPartidosEnBD() {
		boolean correcto = false;
		String strSQL = "";
		try {
			for (Partido partidoActual : listaPartidos.getListaPartidos()) {
				strSQL = "INSERT INTO partido(idlocal, idvisitante, idarbitro, idjornada, fecha) " + 
						"VALUES (" + 
						partidoActual.getLocal().getID() + ", " + 
						partidoActual.getVisitante().getID() + ", " + 
						partidoActual.getArbitro().getID() + ", " + 
						partidoActual.getIdJornada() + ", " + 
						"(SELECT fecha FROM jornada WHERE idJornada = " + partidoActual.getIdJornada() + ")" + 
						");";
				Principal.BBDD.agregarSentencia(strSQL);
			}
			Principal.BBDD.ejecutarSentencias();
			correcto = true;
		}
		catch(SQLException e) {
			e.printStackTrace();
		}
		return correcto;
	}

	/**
	 * @author Jonatan Perez
	 */
	public void agregarPartidoALista(Partido pPartido) {
		listaPartidos.getListaPartidos().add(pPartido);
	}
	
	
	/**
	 * @author Lucia Rodero
	 * @return void
	 * Crea la lista de convocados de un partido para un equipo.
	 * @param pList, pIdPartido
	 */
	public void anadirConvocados(List<String> pList, int pIdPartido) {
		Iterator<String> it = pList.iterator();
		int jug = 0;
		while(it.hasNext()) {
			jug = Integer.parseInt(it.next());
			try {
				Principal.BBDD.insertar("INSERT INTO convocatoria VALUES('" + jug + "', " + pIdPartido + ");");
			}catch(SQLException e) {
				e.printStackTrace();
			}
		}
	}
	
	/**
	 * @author Lucia Rodero
	 * @return void
	 * Crea la lista de titulares de un partido para un equipo.
	 * @param pList, pIdPartido
	 */
	public void anadirTitulares(ArrayList<String> pList, int pIdPartido) {
		Iterator<String> it = pList.iterator();
		int jug = 0;
		while(it.hasNext()) {
			jug = Integer.parseInt(it.next());
			try {
				Principal.BBDD.insertar("INSERT INTO alineacion VALUES('" + jug + "', " + pIdPartido + ");");
			}catch(SQLException e) {
				e.printStackTrace();
			}
		}
	}
	
	public ResultSet getConvocados(int pIdPartido, int pIdEquipo) {
		String str = "SELECT j.nombreJug as nombre, c.idJugador as valor FROM jugador j, partido p, convocatoria c WHERE p.idpartido = c.idpartido AND c.idjugador = j.idjugador AND p.idpartido = " + pIdPartido + " AND j.idequipo = " + pIdEquipo + ";";
		ResultSet rs = null;
		try {
			rs = Principal.BBDD.consulta(str);
		} catch(SQLException e) {
			e.printStackTrace();
		}
		return rs;
	}
	/**
	 * @author Bego*/
	public ResultSet obtenerPartidosDeArbitroOrdenados(int pIdArbitro) {

		ResultSet partidos = null;
		String strSQL = "SELECT p.idPartido AS valor, CONCAT(e1.nombre, ' - ', e2.nombre) AS nombre " +
				"FROM partido p, arbitro a, equipo e1, equipo e2 " +
				"WHERE p.idArbitro = a.idArbitro " +
				"AND a.idArbitro = " +  pIdArbitro + " " +
				"AND e1.idEquipo = p.idLocal " +
				"AND e2.idEquipo = p.idVisitante " +
				"AND p.fecha > current_date() " +
				"ORDER BY p.fecha ASC";
		try {
			partidos = Principal.BBDD.consulta(strSQL);
		}
		catch(SQLException ex) {
			System.out.println("obtenerPartidosDeArbitro");
			System.out.println("SQLException: " + ex.getMessage());
			System.out.println("SQLState: " + ex.getSQLState());
			System.out.println("VendorError: " + ex.getErrorCode());
		}
		return partidos;
	}
	/**
	 * @author Bego*/
	public int modificarArbitroDeUnPartido(int pIdArbitro, int pIdPartido) {
		int ret = -1;
		ResultSet rs = null;
		try {
			ret = Principal.BBDD.actualizar("UPDATE partido "
					+ "SET idArbitro = " + pIdArbitro
					+ " WHERE idPartido = " + pIdPartido);

		} catch (SQLException ex) {
			System.out.println("SQLException: " + ex.getMessage());
			System.out.println("SQLState: " + ex.getSQLState());
			System.out.println("VendorError: " + ex.getErrorCode());
		}
		return ret;

	}	
}